<?php

/**
 * @class Gestion : classe static de gestion des comptes
 * Elle possede donc plusieur methodes static d'outils
 */
class Gestion
{
  /**
   * Recupere tous les utilisateurs
   *
   * @return les utilisateurs
   */
  function get_users()
  {
    global $BDD;

    $user = array();

    $BDD->query("SELECT user_id, username, perms, name FROM auth_user;");
    while ($BDD->next_record())
    {
      $user[] = array( 'uid'   =>$BDD->f('user_id')
                     , 'login' =>$BDD->f('username')
                     , 'perms' =>$BDD->f('perms')
                     , 'name'  =>$BDD->f('name')
                     );
    }
    return $user;
  }

  /**
   * Met a jour le mot de passe d'un utilisateur
   *
   * @param $pwd  nouveau mot de passe
   *
   * @return true si le mot de passe à été mis a jour, false sinon
   */
  function update_pwd($who, $pwd)
  {
    global $BDD;

    $BDD->query("UPDATE auth_user SET password=MD5('$pwd') WHERE user_id='$who';");
    return ($BDD->affected_rows() == 1);
  }

  /**
   * retourne le nom d'un utilisateur
   *
   * @param $who  id de l'utilisateur
   *
   * @return le nom d'un utilisateur, false sinon
   */
  function get_user_name($who)
  {
    global $BDD;

    $name = false;
    $BDD->query("SELECT name FROM auth_user WHERE user_id='$who';");
    if ($BDD->next_record())
    {
      $name = $BDD->f('name');
    }
    return $name;
  }

  /**
   * Créé un nouveau compte
   *
   * @param  $no_compte  numéro de compte
   * @param  $libelle    libellé du compte
   * @param  $user       propriétaire du compte
   *
   * @return l'id du compte créé, ou false en cas d'erreur
   */
  function create_compte($no_compte, $libelle, $user)
  {
    global $BDD;

    $id = false;
    $libelle = mysql_escape_string($libelle);
    $BDD->query("INSERT INTO comptes VALUES('', '$no_compte', '$libelle');");
    if ($BDD->affected_rows() == 1)
    {
      $id = $BDD->insert_id();
      $BDD->query("INSERT INTO titulaires VALUES('$user', $id);");
    }
    return $id;
  }

  /**
   * Met a jour un compte
   *
   * @param $id       id du numéro de compte
   * @param $numero   numéro du compte
   * @param $libelle  libelle du compte
   *
   * @return true si le compte a été mis a jour
   */
  function update_compte($id, $numero, $libelle)
  {
    global $BDD;
    $BDD->query( "UPDATE comptes SET numero='$numero', libelle='$libelle' "
               . "WHERE id_compte=$id;");
    return ($BDD->affected_rows() == 1);
  }

  /**
   * Supprime un compte
   *
   * @param $id_compte  id du numéro de compte
   *
   * @return true si le compte a été supprimé
   */
  function delete_compte($id_compte)
  {
    global $BDD;

    $BDD->query("DELETE FROM comptes WHERE id_compte=$id_compte;");
    return ($BDD->affected_rows() == 1);
  }

  /**
   * Recupere la liste des compte d'un utilisateur
   *
   * @param $user  proprietaire du compte
   *
   * @return la liste des comptes
   */
  function get_comptes($user)
  {
    global $BDD;

    $comptes = array();

    $BDD->query( "SELECT c.id_compte, c.numero, c.libelle FROM comptes c, titulaires t "
                ." WHERE t.id_titulaire='$user' AND t.id_compte=c.id_compte;");
    while ($BDD->next_record())
    {
      $comptes[] = array( 'id'      => $BDD->f('id_compte')
                        , 'numero'  => $BDD->f('numero')
                        , 'libelle' => $BDD->f('libelle')
                        );
    }
    return $comptes;
  }

  /**
   * Recupere les informations concernant un compte
   *
   * @param $id_compte  id du compte
   *
   * @return les infos du compte
   */
  function get_infos_compte($id_compte)
  {
    global $BDD;

    $infos = false;
    $BDD->query("SELECT numero, libelle FROM comptes WHERE id_compte=$id_compte;");
    if ($BDD->next_record())
    {
      $infos = array( 'numero'  => $BDD->f('numero')
                    , 'libelle' => $BDD->f('libelle')
                    );
    }
    return $infos;
  }

  /**
   * Recupere le solde d'un compte
   *
   * @param  $id_compte  id du numéro de compte
   *
   * @return solde du compte
   */
  function get_solde($id_compte)
  {
    global $BDD;

    $solde = 0;
    $BDD->query("SELECT SUM(montant) as credit FROM operations WHERE id_compte=$id_compte AND type='credit'");
    $solde = $BDD->next_record() ? $BDD->f('credit') : 0;

    $BDD->query("SELECT SUM(montant) as debit FROM operations WHERE id_compte=$id_compte AND type='debit'");
    $solde -= $BDD->next_record() ? $BDD->f('debit') : 0;

    return $solde;
  }

  /**
   * Recupere le montant dépensé par une catégorie
   *
   * @param $id_compte  id du numero du compte
   * @param $id_cat     id de la categorie
   *
   * @return montant
   */
  function get_montant_categorie($id_compte, $id_cat)
  {
    global $BDD;

    $montant = 0;
    $BDD->query( "SELECT SUM(montant) as montant "
               . "FROM operations "
               . "WHERE id_compte=$id_compte AND id_categorie=$id_cat AND type='debit';");
    if ($BDD->next_record())
    {
      $montant = $BDD->f('montant') ? $BDD->f('montant') : 0;
    }

    return $montant;
  }

  /**
   * Recupere la liste des opérations effectuées sur un compte sur un
   *   mois donné
   *
   * @param $id_compte  id du numero du compte
   * @param $date       date correspondant au mois affiché
   *
   * @return la liste des opérations
   */
  function get_operations($id_compte, $date)
  {
    global $BDD;

    $operations = array();

    $info_date  = DateSql::get_infos($date);
    $date_debut = DateSql::create(1, $info_date['mois'], $info_date['annee']);
    $date_fin   = DateSql::create($info_date['nbJours'], $info_date['mois'], $info_date['annee']);

    $BDD->query( "SELECT o.id_operation, o.date, o.montant, o.type, o.infos, c.nom, c.id_categorie "
               . "FROM operations o, categories c "
               . "WHERE o.id_compte=$id_compte AND c.id_categorie=o.id_categorie "
               . "  AND o.date>='$date_debut' AND o.date<='$date_fin' "
               . "ORDER BY date ASC;");
    while ($BDD->next_record())
    {
      $operations[] = array( 'id'      => $BDD->f('id_operation')
                           , 'date'    => $BDD->f('date')
                           , 'montant' => $BDD->f('montant')
                           , 'type'    => $BDD->f('type')
                           , 'infos'   => $BDD->f('infos')
                           , 'cat'     => $BDD->f('nom')
                           , 'id_cat'  => $BDD->f('id_categorie')
                           );
    }
    return $operations;
  }
  
  function get_info_operation($id)
  {
    global $BDD;

    $operations = false;

    $BDD->query( "SELECT o.id_operation, o.date, o.montant, o.type, o.infos, c.nom, o.id_categorie "
               . "FROM operations o, categories c "
               . "WHERE o.id_operation=$id and o.id_categorie = c.id_categorie;");
               
    if ($BDD->next_record())
    {
      $operations = array( 'id'      => $BDD->f('id_operation')
                           , 'date'    => $BDD->f('date')
                           , 'montant' => $BDD->f('montant')
                           , 'type'    => $BDD->f('type')
                           , 'infos'   => $BDD->f('infos')
                           , 'cat'     => $BDD->f('nom')
                           , 'id_cat'  => $BDD->f('id_categorie')
                           );
    }
    return $operations;
  }

  /**
   * Ajoute une operation sur un compte
   *
   * @param  $id_compte  id du numero de compte
   * @param  $date       date de l'operation
   * @param  $montant    montant de l'operation
   * @param  $id_cat     id de la categorie de l'operation
   * @param  $debit      bool indiquant si c'est un débit (true) ou un crédit (false)
   * @param  $infos      informations supplémenataires sur l'operation
   *
   * @return l'id de l'operation ou false si l'operation n'a pas pu etre créée
   */
  function add_operation($id_compte, $date, $montant, $id_cat, $debit, $infos)
  {
    global $BDD;

    $id_op = false;

    $type = $debit ? 'debit' : 'credit';
    $infos = mysql_escape_string($infos);
    $BDD->query("INSERT INTO operations VALUES('', '$date', '$montant', $id_compte, $id_cat, '$type', '$infos');");
    if ($BDD->affected_rows() == 1)
    {
      $id_op = $BDD->insert_id();
    }
    return $id_op;
  }
  
  /**
   * Met a jour une opération
   *
   * @param $id       id de l'opération
   * @param $numero   numéro du compte
   * @param $libelle  libelle du compte
   *
   * @return true si le compte a été mis a jour
   */
  function update_operation($id, $date, $montant, $id_cat, $infos)
  {
    global $BDD;
    $BDD->query( "UPDATE operations SET date='$date', montant='$montant', id_categorie='$id_cat', infos='$infos' "
               . "WHERE id_operation=$id;");
    return ($BDD->affected_rows() == 1);      
  }
  /**
   * Supprime une opération
   *
   * @param $id  id de l'opération
   *
   * @return true si l'opération a été supprimée
   */
  function delete_operation($id_opt)
  {
    global $BDD;

    $BDD->query("DELETE FROM operations WHERE id_operation=$id_opt;");
    return ($BDD->affected_rows() == 1);
  }
  /**
   * Ajoute une nouvelle categorie
   *
   * @param $nom  Nom de la catégorie
   *
   * @return l'ID de la categorie crée ou false
   */
  function add_categorie($nom)
  {
    global $BDD;

    $id_cat = false;

    $nom = mysql_escape_string($nom);
    $BDD->query("INSERT INTO categories VALUES('', '$nom');");
    if ($BDD->affected_rows() == 1)
    {
      $id_cat = $BDD->insert_id();
    }
    return $id_cat;
  }

  /**
   * Recupere le nom d'une categorie
   *
   * @param $id_cat id de la categorie
   *
   * @return le nom de la categorie
   */
  function get_categorie($id_cat)
  {
    global $BDD;

    $categorie = false;
    $BDD->query("SELECT nom FROM categories WHERE id_categorie=$id_cat;");
    if ($BDD->next_record())
    {
      $categorie = $BDD->f('nom');
    }
    return $categorie;
  }

  /**
   * Recupere toutes les categories
   *
   * @return les categories
   */
  function get_categories()
  {
    global $BDD;

    $categories = array();

    $BDD->query("SELECT id_categorie, nom FROM categories;");
    while ($BDD->next_record())
    {
      $categories[] = array( 'id'  => $BDD->f('id_categorie')
                           , 'nom' => $BDD->f('nom')
                           );
    }
    return $categories;
  }

  /**
   * Effectue une recherche d'operation
   *
   * @param $who   proprietaire des comptes
   * @param $how   tableau contenant les criteres de recherche
   *                 (date, montant, compte)
   * @param $what  informations des champs
   *                 (date_min, date_max, montant_min, montant_max, id_compte)
   *
   * @return les categories
   */
  function find_operations($who, $how, $what)
  {
    global $BDD;

    $operations = array();

    $where = array( "o.id_compte = cpt.id_compte"
                  , "o.id_categorie = cat.id_categorie"
                  , "t.id_titulaire = '$who'"
                  , "t.id_compte = cpt.id_compte"
                  );
    if (in_array('compte', $how))
    {
      $id_compte = $what['id_compte'];
      $where[]   = "o.id_compte=$id_compte";
    }

    if (in_array('date', $how))
    {
      $date_min = $what['date_min'];
      $date_max = $what['date_max'];
      $where[]  = "o.date>='$date_min' AND o.date<='$date_max'";
    }

    if (in_array('montant', $how))
    {
      $montant_min = $what['montant_min'];
      $montant_max = $what['montant_max'];
      $where[]     = "o.montant>='$montant_min' AND o.montant<='$montant_max'";
    }

    $where = implode(' AND ', $where);

    $req = "SELECT o.id_operation, o.date, o.montant, o.type, o.infos, "
         . "  cat.nom,"
         . "  cpt.id_compte, cpt.numero, cpt.libelle "
         . "FROM operations o, categories cat, comptes cpt, titulaires t "
         . "WHERE $where "
         . "ORDER BY date ASC;";

    $BDD->query($req);
    while ($BDD->next_record())
    {
      $operations[] = array( 'id_operation'   => $BDD->f('id_operation')
                           , 'date'           => $BDD->f('date')
                           , 'montant'        => $BDD->f('montant')
                           , 'type'           => $BDD->f('type')
                           , 'infos'          => $BDD->f('infos')
                           , 'categorie'      => $BDD->f('nom')
                           , 'numero_compte'  => $BDD->f('numero')
                           , 'libelle_compte' => $BDD->f('libelle')
                           );
    }
    return $operations;
  }
  
  /**
   * Retourne le buget d'un titulaire
   * 
   * @param $who  titulaire du budget
   * 
   * @return le budget            
   */
  function get_budget($who)
  {
    global $BDD;

    $budget = array();
    $BDD->query( "SELECT id_categorie, nom FROM categories;");
    while ($BDD->next_record())
    {
      $budget[$BDD->f('id_categorie')] = array( 'nom'          => $BDD->f('nom')
                                              , 'id_categorie' => $BDD->f('id_categorie')
                                              , 'id_budget'    => null
                                              , 'montant'      => null
                                              );
    }
    
    $BDD->query("SELECT id_categorie, id_budget, montant FROM budget WHERE id_titulaire='$who';");
    while ($BDD->next_record())
    {
      $budget[$BDD->f('id_categorie')]['id_budget'] = $BDD->f('id_budget');
      $budget[$BDD->f('id_categorie')]['montant']   = $BDD->f('montant');
    }
    return $budget;
  }

  /**
   * Crée un budget
   * 
   * @param $who      titulaire du budget
   * @param $id_cat   id de la catégorie
   * @param $montant  montant associé à la catégorie
   * 
   * @return l'id du budget
   */
   function create_budget($who, $id_cat, $montant)
   {
     global $BDD;
     
     $id_budget = false;
     $BDD->query("INSERT INTO budget VALUES('', $id_cat, '$who', $montant);");
     if ($BDD->affected_rows() == 1)
     {
       $id_budget = $BDD->insert_id();
     }
     return $id_budget;
   }

  /**
   * modifie un budget
   * 
   * @param $id_budget   id du budget
   * @param $montant    nouveau montant du budget
   * 
   * @return true si le budget a été mis à jour
   */
   function update_budget($id_budget, $montant)
   {
     global $BDD;
     
     $BDD->query("UPDATE budget SET montant=$montant WHERE id_budget=$id_budget;");
     return ($BDD->affected_rows() == 1);
   }

  /**
   * Supprime un budget
   * 
   * @param $id_budget   id du budget
   * 
   * @return true si le budget a été supprimé
   */
   function remove_budget($id_budget)
   {
     global $BDD;
     
     $BDD->query("delete FROM budget WHERE id_budget=$id_budget;");
     return ($BDD->affected_rows() == 1);
   }
}
?>
